package com.company.multithreads;

/**【可见性问题】
 * 案例01:
 *      目标：演示可见性问题
 *      一个线程对共享变量的修改,另一个线程不能立即得到最新值
 *
 *      1. 创建一个共享变量
 *      2. 创建一条线程不断读取共享变量
 *      3. 创建一条线程修改共享变量
 *
 * 小结：并发编程时，会出现可见性问题，当一个线程对共享变量进行了修改，另外的线程并没有立即看到修改后的最新值。
 */

public class Test01VisibilityDemo {
    // 1. 创建一个共享变量
//    private static boolean run = true;
    // 使用 volatile 进行修饰 run 变量
//    private static volatile boolean run = true;

    private static boolean run = true;
    // 创建一把锁【光加锁，没有volatile 不顶事啊！上面那一行得加 valatile 关键字才起作用；是不是我理解有问题了？？？->是的！！！不对啊，槽】
    private static Object obj = new Object();

    public static void main(String[] args) throws InterruptedException {

        // 2. 创建一条线程不断读取共享变量
/*
        Thread t1 = new Thread(() -> {
            while (run) {
                synchronized (obj) {
                    System.out.println("线程1执行");
                }
            }
        });
*/

        // 2. 槽之后的写法，创建一条线程不断读取共享变量【不对，理解不了】
        Thread t1 = new Thread(() -> {
            synchronized (obj) {
                while (run) {
                    System.out.println("线程1执行");
                }
            }
        });

        t1.start();
        // 主线程睡眠1s
        Thread.sleep(2000);

        // 3. 创建一条线程修改共享变量
        Thread t2 = new Thread(() -> {
            System.out.println("执行线程2");
            run = false;
            System.out.println("时间到，线程2设置为false");
        });
        t2.start();
    }
}
